#define COM 4
int segPins[] = {2,3,4,5,6,7,8,9};  //数码管LED连接的引脚 abcdefgh    （但是注意LED是 LOW 点亮）
int comPins[] = {10,11,12,13};     //数码管公共端   （由于是共阴 HIGH 点亮）
unsigned char displayTemp[4];//显示缓冲区
const unsigned char code[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//共阴段码0-9,.

void setup() {
  // 循环设置，把对应的端口都设置成输出
  Serial.begin(115200);
  while(!Serial){;}
  for (int thisLed = 0; thisLed < 8; thisLed++) { pinMode(segPins[thisLed], OUTPUT); }
  for (int thisSeg = 0; thisSeg < 4; thisSeg++) { pinMode(comPins[thisSeg], OUTPUT); }
  for (int i = 0; i < COM; i++){digitalWrite(comPins[i],LOW);}
  for (int i = 0; i < 8; i++){digitalWrite(segPins[i],HIGH);}
  play(0);// 清除“鬼影”
  Serial.print("ok");
}

//单个数码管显示函数 0 ~ 9
void play(char value){
  for(int i=0;i<8;i++)
    digitalWrite(segPins[i],!bitRead(value,i));  //使用了bitWrite 函数，非常简单
}
 //小数点显示
void dispDec(int x)
{
  digitalWrite(segPins[7] ,LOW);
}

//显示单个数字
void pickDigit(int x)
{
  digitalWrite(comPins[0],LOW);
  digitalWrite(comPins[1],LOW);
  digitalWrite(comPins[2],LOW);
  digitalWrite(comPins[3],LOW);
  switch(x)
  {
    case 0:digitalWrite(comPins[0],HIGH);break;
    case 1:digitalWrite(comPins[1],HIGH);break;  
    case 2:digitalWrite(comPins[2],HIGH);break;
    case 3:digitalWrite(comPins[3],HIGH);break;
    default: break;
  }
 }
//清空数码管LED显示（防止鬼影）
void clearLEDs()
{
  for (int j =0 ; j < 8; j++)
    digitalWrite(segPins[j],HIGH);
}

void loop() {
  static unsigned int num=1;//定义一个数据
  static unsigned long lastTime=0;
  //值得学习
  if (millis() - lastTime >= 1000) {
    lastTime = millis();
    num++;
 }
displayTemp[0]=code[num/1000]; //动态显示千位显示
displayTemp[1]=code[(num%1000)/100];//百位数
displayTemp[2]=code[((num%1000)%100)/10];//十位数
displayTemp[3]=code[((num%1000)%100)%10];//个位数

for(int cunt = 0; cunt < 4; cunt++){
  clearLEDs();  //防止LED闪烁的影子
  dispDec(1);  //显示的小数点
  pickDigit(cunt);
  play(displayTemp[cunt]);  
  delayMicroseconds(66);   //重点注意这里微秒的延迟时间 (肉眼50毫秒以下看不闪动)
}
if(num == 9999)
    num = 1000;
}
